"""
*args 和 **kwargs

向python传递参数的方式有两种:
位置参数（positional argument）
关键词参数（keyword argument）

*args 表示任何多个无名参数， 他本质上是一个 tuple
** kwargs 表示关键字参数， 它本质上是一个 dict
同时使用时必须要求 *args 参数列要在** kwargs 前面

"""


def test(arg1, arg2, arg3):
    print(arg1, arg2, arg3)


def test2(arg1, *args):
    print(arg1)
    # *args 表示任何多个无名参数， 他本质上是一个 tuple
    print(args)
    for arg in args:
        print(arg)


def test3(arg1, **kwargs):
    """
    **kwargs 表示关键字参数， 它本质上是一个 dict
    :param arg1:
    :param kwargs:
    :return:
    """
    print(arg1)
    print(type(kwargs))
    print(kwargs)


def test4(x, *args, **kwargs):
    """
    arg,*args,**kwargs ,三者是可以组合使用的，但是组合使用需要遵循一定的语法规则，即顺序为王。
    """
    print(x)
    print(args)
    print(kwargs)


def test5(a, b, p1=None, p2=None, p3=None):
    print(a, p1, p2, p3)


def test6(a, **kwargs):
    test5(1, 2, **kwargs)


if __name__ == '__main__':
    # test(1, 2, 3)
    # test2("first1", 'first2', 'first3')
    # test3(1, a=1, b=2, q=5, d=[], m={})
    # test4(1, 23, 3, 3, 3, a=1, b=2, c=3)
    test5(1, 2, p1="", p2={"1": 2})
